<?php

/*
 if (!empty($_POST['submit'])) {
 $upload= new UploadFile($_FILES['files'], './tmp');
 //上传用户文件，返回int值，为上传成功的文件个数。
 $num= $upload->upload();
 if ($num!= 0) {
 echo"上传成功<br>";
 echo $num."个文件上传成功";
 }
 else {
 echo"上传失败<br>";
 }
*/

class framework_base_upload {
    public $user_post_file = array();
    //用户上传的文件
    public $save_file_path;
    //存放用户上传文件的路径
    public $max_file_size;
    //文件最大尺寸
    public $last_error;
    //记录最后一次出错信息
    //默认允许用户上传的文件类型
    public $allow_type = array(
        'gif',
        'jpg',
        'png',
        'zip',
        'rar',
        'txt',
        'doc',
        'pdf',
        'docx'
    );
    public $final_file_path;
    //最终保存的文件名
    public $save_info = array();
    //返回一组有用信息，用于提示用户。

	//是否需要resize图片
	public $resize_flag=false;
	//resize图片的最大宽度
	public $resize_max_width;
	//resize图片的最大高度
	public $resize_max_height;

    /**
     * 构造函数
     */
    function __construct($file, $path, $size = 2097152, $type = '') {
        $this->user_post_file = $file;
        if (!is_dir($path)) {//存储路径文件不存在就创建
            mkdir($path);
            chmod($path, 0777);
        }
        $this->save_file_path = $path;
        $this->max_file_size = $size;
        //如果用户不填写文件大小，则默认为2M.
        if ($type != '')
            $this->allow_type = $type;
    }

    /**
     * 存储用户上传文件，检验合法性通过后，存储至指定位置。
     */
    function upload() {
		if ($this->user_post_file['error'] == 1){
			$this->last_error=1;
			return;
		}
    	if(count($this->user_post_file['name'])>0){
			//取当前文件名、临时文件名、大小、扩展名，后面将用到。
			$name = $this->user_post_file['name'];
			$tmpname = $this->user_post_file['tmp_name'];
			$size = $this->user_post_file['size'];
			$mime_type = $this->user_post_file['type'];
			$type = $this->getFileExt($this->user_post_file['name']);
			$this->upfile($name,$tmpname,$size,$mime_type,$type);
    	}else{
    		 for ($i = 0; $i < count($this->user_post_file['name']); $i++) {
				//如果当前文件上传功能，则执行下一步。
				if ($this->user_post_file['error'][$i] == 0) {
					//取当前文件名、临时文件名、大小、扩展名，后面将用到。
					$name = $this->user_post_file['name'][$i];
					$tmpname = $this->user_post_file['tmp_name'][$i];
					$size = $this->user_post_file['size'][$i];
					$mime_type = $this->user_post_file['type'][$i];
					$type = $this->getFileExt($this->user_post_file['name'][$i]);
					$this->upfile($name,$tmpname,$size,$mime_type,$type);
				}
	    	}
       
       }
       return count($this->save_info);
        //返回上传成功的文件数目
    }
	
	function upfile($name,$tmpname,$size,$mime_type,$type)
	{
		//检测当前上传文件大小是否合法。
		if (!$this->checkSize($size)) {
			$this->last_error = 1 ;
			return;
		}
		//检测当前上传文件扩展名是否合法。
		if (!$this->checkType($type)) {
			$this->last_error = 2 ;
			return;
		}
		//检测当前上传文件是否非法提交。
		if (!is_uploaded_file($tmpname)) {
			$this->last_error = 3 ;
			return;
		}
		//移动文件后，重命名文件用。
		//$basename = $this->getBaseName($name, "." . $type);
		//为防止文件名乱码
		//$basename = iconv("UTF-8", "gb2312", $basename);
		//移动后的文件名
		//$saveas = $basename . time() . "." . $type;
		$saveas = str_replace('.','',microtime(true)) . '.' . $type;
		//组合新文件名再存到指定目录下，格式：存储路径 + 文件名 + 时间 + 扩展名

		$this->final_file_path = $this->save_file_path . "/" . $saveas;

		if (!move_uploaded_file($tmpname, $this->final_file_path)) {
			$this->last_error = $this->user_post_file['error'][$i];
			$this->halt($this->last_error);
			return;
		}
		if($this->resize_flag===true){
			$this->resizeImage($this->final_file_path,$this->resize_max_width,$this->resize_max_heigth,$this->final_file_path,$type);
		}

		//存储当前文件的有关信息，以便其它程序调用。
		$this->save_info[] = array(
			"name" => $name,
			"type" => $type,
			"mime_type" => $mime_type,
			"size" => $size,
			"saveas" => $saveas,
			"path" => $this->final_file_path
		);
	}

    /**
     * 返回一些有用的信息，以便用于其它地方。
     */
    function getSaveInfo() {
        return $this->save_info;
    }

    /**
     * 检测用户提交文件大小是否合法
     */
    function checkSize($size) {
		if(empty($size))
			return false;
        if ($size > $this->max_file_size) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 检测用户提交文件类型是否合法
     */
    function checkType($extension) {
        foreach ($this->allow_type as $type) {
            if (strcasecmp($extension, $type) == 0)
                return true;
        }
        return false;
    }

    /**
     * 显示出错信息
     */
    function halt($msg) {
        printf("<b><UploadFile Error:></b> %s <br>\n", $msg);
    }

    /**
     * 取文件扩展名
     */
    function getFileExt($filename) {
        $stuff = pathinfo($filename);
        return $stuff['extension'];
    }

    /**
     * 取给定文件文件名，不包括扩展名。
     */
    function getBaseName($filename, $type) {
        $basename = basename($filename, $type);
        return $basename;
    }

	/**
	 * 图片缩放
	 * $im 图片对象，应用函数之前，你需要用imagecreatefromjpeg()读取图片对象，如果PHP环境支持PNG，GIF，也可使用imagecreatefromgif()，imagecreatefrompng()；
	 * $maxwidth 定义生成图片的最大宽度（单位：像素）
	 * $maxheight 生成图片的最大高度（单位：像素）
	 * $name 生成的图片名
	 * $filetype 最终生成的图片类型（.jpg/.png/.gif）
	 */
	static function resizeImage($im,$maxwidth,$maxheight,$target,$type)
	{
		if($type=='jpg' || $type=='jpeg')
			$im=imagecreatefromjpeg($im);
		elseif($type=='png')
			$im=imagecreatefrompng($im);
		else
			return;

		$pic_width = imagesx($im);
		$pic_height = imagesy($im);

		if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight))
		{
			if($maxwidth && $pic_width>$maxwidth)
			{
				$widthratio = $maxwidth/$pic_width;
				$resizewidth_tag = true;
			}

			if($maxheight && $pic_height>$maxheight)
			{
				$heightratio = $maxheight/$pic_height;
				$resizeheight_tag = true;
			}

			if($resizewidth_tag && $resizeheight_tag)
			{
				if($widthratio<$heightratio)
					$ratio = $widthratio;
				else
					$ratio = $heightratio;
			}

			if($resizewidth_tag && !$resizeheight_tag)
				$ratio = $widthratio;
			if($resizeheight_tag && !$resizewidth_tag)
				$ratio = $heightratio;

			$newwidth = $pic_width * $ratio;
			$newheight = $pic_height * $ratio;

			if(function_exists("imagecopyresampled"))
			{
				$newim = imagecreatetruecolor($newwidth,$newheight);
			    imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
			}
			else
			{
				$newim = imagecreate($newwidth,$newheight);
			    imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
			}

			if($type=='jpg' || $type=='jpeg')
				imagejpeg($newim,$target);
			elseif($type=='png')
				imagepng($newim,$target);
			imagedestroy($newim);
		}
		else
		{
			if($type=='jpg' || $type=='jpeg')
				imagejpeg($im,$target);
			elseif($type=='png')
				imagepng($newim,$target);
		}           
	}
}
